// 引入 express 模块，用于创建路由
const express = require('express');
// 引入数据库连接池，用于与数据库交互
const pool = require('./db');
// 引入 bcrypt 模块，用于密码哈希处理
const bcrypt = require('bcrypt');
// 引入 jsonwebtoken 模块，用于生成和验证 JWT Token
const jwt = require('jsonwebtoken');
// 引入日志记录器，用于记录服务器运行信息和错误信息
const logger = require('./logger');

// 创建路由实例
const router = express.Router();

// 注册新用户的 API 接口
router.post('/api/register', async (req, res) => {
    try {
        // 从请求体中获取用户名、邮箱和密码
        const { userName, email, password } = req.body;

        // 输入验证，确保请求体包含必要的字段
        if (!userName || !email || !password) {
            return res.status(400).json({ error: '用户名、邮箱和密码是必需的' });
        }

        // 对密码进行哈希处理，提高密码的安全性
        const hashedPassword = await bcrypt.hash(password, 10);

        // 执行 SQL 查询，将新用户信息插入到 users 表中
        const [result] = await pool.execute(
            'INSERT INTO users (userName, email, password) VALUES (?, ?, ?)',
            [userName, email, hashedPassword]
        );

        // 获取新插入用户的 ID
        const userId = result.insertId;

        // 返回新用户信息
        res.status(201).json({ id: userId, userName, email });
        logger.info(`用户注册成功: ${userName}`);
    } catch (error) {
        // 记录错误日志
        logger.error(`用户注册失败: ${error.message}`);
        res.status(500).json({ error: '注册失败，请稍后重试' });
    }
});

// 用户登录的 API 接口
router.post('/api/login', async (req, res) => {
    try {
        // 从请求体中获取用户名和密码
        const { userName, password } = req.body;

        // 输入验证，确保请求体包含必要的字段
        if (!userName || !password) {
            return res.status(400).json({ error: '用户名和密码是必需的' });
        }

        // 执行 SQL 查询，根据用户名查找用户信息
        const [rows] = await pool.execute('SELECT * FROM users WHERE userName = ?', [userName]);

        // 如果未找到用户
        if (rows.length === 0) {
            return res.status(401).json({ error: '用户名或密码错误' });
        }

        // 获取用户信息
        const user = rows[0];

        // 比较输入的密码和数据库中存储的哈希密码
        const isPasswordValid = await bcrypt.compare(password, user.password);

        // 如果密码不匹配
        if (!isPasswordValid) {
            return res.status(401).json({ error: '用户名或密码错误' });
        }

        // 生成 JWT Token
        const token = jwt.sign({ userId: user.id, userName: user.userName }, 'your_secret_key', { expiresIn: '1h' });

        // 返回 Token
        res.status(200).json({ token });
        logger.info(`用户登录成功: ${userName}`);
    } catch (error) {
        // 记录错误日志
        logger.error(`用户登录失败: ${error.message}`);
        res.status(500).json({ error: '登录失败，请稍后重试' });
    }
});

// 查询用户信息的 API 接口
router.get('/api/userInfo', async (req, res) => {
    try {
        // 从请求头中获取 Token
        const token = req.headers.authorization;

        // 输入验证，确保请求头包含 Token
        if (!token) {
            return res.status(401).json({ error: '缺少 Token' });
        }

        // 验证 Token
        const decoded = jwt.verify(token.replace('Bearer ', ''), 'your_secret_key');

        // 执行 SQL 查询，根据用户 ID 查找用户信息
        const [rows] = await pool.execute('SELECT userName FROM users WHERE id = ?', [decoded.userId]);

        // 如果未找到用户
        if (rows.length === 0) {
            return res.status(404).json({ error: '用户未找到' });
        }

        // 获取用户信息
        const user = rows[0];

        // 返回用户信息
        res.status(200).json({ userName: user.userName });
        logger.info(`用户信息查询成功: ${user.userName}`);
    } catch (error) {
        // 记录错误日志
        logger.error(`用户信息查询失败: ${error.message}`);
        res.status(401).json({ error: '无效的 Token' });
    }
});

// 导出路由，供 app.js 使用
module.exports = router;